package com.etc.test2;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

// 执行句柄
public class DynaimicProxyHandler implements InvocationHandler{
    IDyTarget target;
   
    public DynaimicProxyHandler(IDyTarget target) {
        super();
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        try {
            System.out.println("------之前-----"); // 打开链接, 开启事务 --前置
            // 执行目标方法
            Object o = method.invoke(target, args);
            System.out.println("------之后----");  // 后置 // commit

            return o;  
        } catch (Exception e) {
            // conn.rollback
            System.out.println("------异常------------"); // 异常通知
        } finally {
            System.out.println("-------return 之前一定执行的----------------"); // 关闭链接 
            
        }
        return null;
    }
    
    public IDyTarget newInstance() {
        // Proxy代理类 创建一个代理对象  参数要 类加载器，  代理的接口，  执行句柄
        return (IDyTarget) Proxy.newProxyInstance(DynaimicProxyHandler.class.getClassLoader(), new Class[]{IDyTarget.class}, this);
    }
}
// 动态代理必须有接口
interface IDyTarget {
    public void aaa();
}
class DyTarget implements IDyTarget {
    public void aaa() {
        System.out.println("aaa");
    }
}
